package logs

import (
	"fmt"
	log "github.com/sirupsen/logrus"
	"os"
	"path"
)

/*
	采用logrus日志框架中以日志等级切割日志的方式，实现将不同的日志输出到不同的日志文件中

	在之前的日志输出设定中，所有日志首先通过设定日志格式，然后分别在日志文件和控制台打印
*/
const (
	all    = "all"
	info   = "info"
	errors = "errors"
)

type FileLevelhook struct {
	file     *os.File
	errFile  *os.File
	infoFile *os.File
	logPath  string
}

func (F FileLevelhook) Levels() []log.Level {
	return log.AllLevels
}
func (F FileLevelhook) Fire(entry *log.Entry) error {
	/*
		自定义日志输出格式 时间  级别  函数 是哪个文件  信息
	*/
	//获取时间戳
	timestamp := entry.Time.Format("2006-01-02 15:04:05")
	//定义文件行号和文件名的变量
	var funcVal, fileVal string
	if entry.HasCaller() {
		//自定义文件行号和文件名  path.Base(entry.Caller.File) 只取相对路径main.go,不取绝对路径D:\go\src\code.oldboyedu.com\studygo\day05\logrus_log3\main.go
		funcVal = entry.Caller.Function
		fileVal = fmt.Sprintf("%s:%d", path.Base(entry.Caller.File), entry.Caller.Line)
	} else {
		funcVal = ""
		fileVal = ""
	}
	//line, _ := entry.String()
	//判断日志等级，不同的等级写到不同的文件中。最后在进行一个全部写入
	switch entry.Level {
	case log.InfoLevel:
		//F.infoFile.Write([]byte(line))
		//自定义输出格式  把内容输出到writer里面
		fmt.Fprintf(F.infoFile, "[%s][%s]  %s %s %s\n", timestamp, entry.Level, fileVal, funcVal, entry.Message)
	case log.ErrorLevel:
		//F.errFile.Write([]byte(line))
		//自定义输出格式  把内容输出到writer里面
		fmt.Fprintf(F.errFile, "[%s][%s]  %s %s %s\n", timestamp, entry.Level, fileVal, funcVal, entry.Message)
	}
	//F.file.Write([]byte(line))
	//自定义输出格式  把内容输出到writer里面
	fmt.Fprintf(F.file, "[%s][%s]  %s %s %s\n", timestamp, entry.Level, fileVal, funcVal, entry.Message)
	return nil
}
func InitLevel(logPath string) {
	//创建目录
	err := os.MkdirAll(fmt.Sprintf("%s", logPath), os.ModePerm)
	if err != nil {
		log.Error(err)
		return
	}
	//打开日志文件 连续创建三个日志文件
	allfile, err := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, all), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	errfile, err := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, errors), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	infofile, err := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, info), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		log.Error(err)
		return
	}
	filehook := FileLevelhook{allfile, errfile, infofile, logPath}
	log.SetReportCaller(true)
	log.SetOutput(filehook.file) //此处表明了只将日志输出到文件中 如果不添加该配置,日志默认在控制台和文件中都打印
	log.AddHook(&filehook)
}
